//
//  ViewController.m
//  NSURLConnection
//
//  Created by apple on 15/8/31.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<NSURLConnectionDataDelegate>


{
    NSMutableData *_responseData;
    NSInteger _expectedLength;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    NSURL *url = [NSURL URLWithString:@"http://apple:password@www.diveinedu.com:80/path/file.txt?a=12&b=23#abc"];
#if 0
    NSLog(@"%@",url.absoluteString);
#endif
    
#if 0 //scheme:协议名
    NSLog(@"scheme: %@",url.scheme);
#endif
    
#if 0  //host:域名-->  www.diveinedu.com;
    NSLog(@"host: %@",url.host);

#endif
    
#if 0  //  path:路径 －》  /path/file.txt
    NSLog(@"path: %@",url.path);

#endif
    
#if 0  //extension:    -->txt
    NSLog(@"extension: %@",url.pathExtension);
#endif
    
#if 0  //port:端口号-->80
    NSLog(@"port: %@",url.port);
#endif
    
#if 0 //param:   -->a=12&b=23
    NSLog(@"param: %@",url.query);
#endif
    
#if 0 //fragment     -->abc;
    NSLog(@"fragment: %@",url.fragment);
#endif
    
#if 0 // user:     -->apple;
    NSLog(@"user: %@",url.user);
#endif
    

    
#if 0   //--->>> ?
    
//  NSURLRequest:是封装了一个URL、请求参数、数据缓存策略等，与协议无关的不可变类。在移动互联网时代，经常用来封装HTTP协议请求。
    
    NSURL *url = [NSURL URLWithString:@"http://www.diveinedu.com"];
//    最简单的方法，全部采用默认值；

//    其中HTTP协议使用GET方法，80端口；
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
   
    NSLog(@"%@",request.URL);   //---> http://www.diveinedu.com
    
    NSLog(@"%@",request.HTTPMethod); //--->GET?
    
    
//  NSMutableURLRequest：是NSURLRequest的可变子类，通过它可以为具体的协议（主要是HTTP协议）设置更多的参数（如HTTP的头域、方法、负载数据等).

#endif
 
//-------------------------------------------------------------
#if 0
//    NSURLConnection:可以用于给服务器发送HTTP请求，是对CFNetwork的封装；
    
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
//    发送异步HTTP请求；
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//        这里需要下载完成才能执行，网络操作远远慢于本地代码执行；
        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    
#endif
    
#if 0
//    NSURLConnection:的对象可以对网络请求过程进行控制（开始／停止等），并且通过多个代理方法告知程序当前的请求状态。
    
    NSURL *url = [NSURL URLWithString:@"http://img.bizhi.sogou.com/images/2012/05/9/4248.jpg"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
//    创建链接对象，但是不开始发送请求；
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    
    [conn start]; // 1⃣️  意思是1⃣️和2⃣️相等
    
// 2⃣️   conn = [NSURLConnection connectionWithRequest:request delegate:self];

#endif
    
    
#if 1
    
    
    NSString *urlString = @"http://c.hiphotos.baidu.com/zhidao/pic/item/f636afc379310a55e9e374d9b64543a9832610d3.jpg";
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] delegate:self];
    
#endif
    // Do any additional setup after loading the view, typically from a nib.
}

//- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
//{
//    NSHTTPURLResponse *respon = (NSHTTPURLResponse *)response;
//    NSInteger length = [respon expectedContentLength];
//    NSLog(@"--->length:%ld",length);
//    NSLog(@"--->length:%@",respon);
//    

//}


//--------------------------------------------------------------------------

//   接收到服务器的响应（有可能失败）
//   代理方法中的connection参数都是表示上面创建的connection对象；

// 判断有没有收到响应；
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//    由于发送的是HTTP请求，所以接受到的也是HTTP的响应；
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    
//    200:请求成功，还有其他的2xx的状态码表示成功；
    
//    关于状态码的详情可以在第一条参考资料中找到，相当重要；
    
    if (httpResponse.statusCode == 200)
    {
//      创建可变的data，用于存放从服务器获取的数据；
     _responseData = [NSMutableData data];
        
//      响应内容的总长度
     _expectedLength = httpResponse.expectedContentLength;
     
        
        NSLog(@"%@",response);
    }
    
//    请求头部和响应头部的区别？
}
//------------------------------------------------------------------------

//响应数据，当数据量较大的时候，会进行分割，通过＊＊＊多次调用＊＊＊这个方法进行返回；
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//    多次获取的数据拼接成一个完整的响应数据；
    [_responseData appendData:data];
    NSLog(@"下载进度：%.2f%%",_responseData.length * 100.0 / _expectedLength);
    
}

//下载完成

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [_responseData writeToFile:@"Users/apple/Desktop/abcd.jpg" atomically:YES];
}

//请求失败

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"%@",error);
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
